JWT (JSON Web Token) একটি ওপেন স্ট্যান্ডার্ড যা নিরাপদভাবে তথ্য আদান-প্রদান করার জন্য ব্যবহৃত হয়। এটি একটি ক্রিপ্টোগ্রাফিক সাইনড টোকেন যা ব্যবহারকারীর প্রমাণীকরণ (authentication) এবং অনুমোদন (authorization) পরিচালনায় গুরুত্বপূর্ণ ভূমিকা পালন করে। স্প্রিং বুট (Spring Boot) এর সাথে JWT ব্যবহার করে নিরাপদ REST API তৈরি করা একটি জনপ্রিয় পদ্ধতি। এখানে আমরা দেখব কীভাবে স্প্রিং বুটে JWT Authentication ইন্টিগ্রেট করা যায়।
JWT টোকেন দুটি প্রধান অংশে বিভক্ত:
JWT টোকেন সাধারণত দুটি উদ্দেশ্যে ব্যবহৃত হয়:
স্প্রিং বুটে JWT Authentication ইন্টিগ্রেট করতে, কিছু গুরুত্বপূর্ণ স্টেপ অনুসরণ করতে হয়। এখানে একটি সাধারণ উদাহরণ দেওয়া হলো, যেখানে স্প্রিং বুট অ্যাপ্লিকেশন তৈরি করা হবে এবং JWT Authentication ব্যবহার করা হবে।
pom.xml ফাইলে প্রয়োজনীয় ডিপেনডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
এখানে spring-boot-starter-security
স্প্রিং সিকিউরিটির জন্য এবং jjwt
JWT টোকেন ব্যবহারের জন্য ব্যবহার করা হয়েছে।
এখন আমরা একটি JWTUtility ক্লাস তৈরি করব, যা JWT টোকেন তৈরি এবং যাচাই করবে।
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class JWTUtil {
private String secretKey = "secret"; // সিক্রেট কী যা JWT সাইন করার জন্য ব্যবহৃত হবে
// JWT টোকেন তৈরি করার পদ্ধতি
public String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60)) // 1 ঘণ্টার জন্য টোকেন
.signWith(SignatureAlgorithm.HS256, secretKey)
.compact();
}
// JWT টোকেন থেকে ব্যবহারকারীর নাম (username) বের করার পদ্ধতি
public String extractUsername(String token) {
return extractClaims(token).getSubject();
}
// JWT টোকেন থেকে Claims (টোকেনের Payload) বের করার পদ্ধতি
private Claims extractClaims(String token) {
return Jwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(token)
.getBody();
}
// টোকেনের বৈধতা যাচাই করার পদ্ধতি
public Boolean validateToken(String token, String username) {
String extractedUsername = extractUsername(token);
return (extractedUsername.equals(username) && !isTokenExpired(token));
}
// টোকেনটি মেয়াদ উত্তীর্ণ হয়েছে কিনা তা যাচাই করার পদ্ধতি
private Boolean isTokenExpired(String token) {
return extractClaims(token).getExpiration().before(new Date());
}
}
এই ক্লাসটি generateToken
মেথড ব্যবহারকারীর জন্য একটি JWT টোকেন তৈরি করবে এবং validateToken
মেথড এটি যাচাই করবে।
স্প্রিং সিকিউরিটি কনফিগারেশন ফিল্টার ব্যবহার করে JWT টোকেন যাচাই করা হয়। এখানে একটি JWTFilter
ক্লাস তৈরি করা হলো, যা API কলের সময় JWT টোকেনকে পরীক্ষা করবে।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
public class JWTFilter extends OncePerRequestFilter {
@Autowired
private JWTUtil jwtUtil;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String token = request.getHeader("Authorization");
if (token != null && token.startsWith("Bearer ")) {
token = token.substring(7);
String username = jwtUtil.extractUsername(token);
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
if (jwtUtil.validateToken(token, username)) {
// Authenticated, set user context here if needed
}
}
}
filterChain.doFilter(request, response);
}
}
স্প্রিং সিকিউরিটি কনফিগারেশন ব্যবহার করে JWT ফিল্টার সেটআপ করা হবে। SecurityConfig
ক্লাসে সিকিউরিটি কনফিগারেশন করা হবে।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private JWTFilter jwtFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/login", "/register").permitAll() // Allow public access to these endpoints
.anyRequest().authenticated() // All other requests need authentication
.and()
.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class); // Add JWT filter
}
}
লগইন করার জন্য একটি API তৈরি করা হবে, যা সঠিক ইউজারনেম এবং পাসওয়ার্ড হলে JWT টোকেন রিটার্ন করবে।
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/auth")
public class AuthController {
@Autowired
private JWTUtil jwtUtil;
@PostMapping("/login")
public String login(@RequestBody UserCredentials credentials) {
// Validate user credentials (e.g. check in database)
if (credentials.getUsername().equals("user") && credentials.getPassword().equals("password")) {
return jwtUtil.generateToken(credentials.getUsername());
} else {
throw new RuntimeException("Invalid credentials");
}
}
}
স্প্রিং বুটে JWT Authentication ইন্টিগ্রেট করার জন্য, আমাদের প্রথমে JWT Utility তৈরি করতে হয় যা টোকেন তৈরি ও যাচাই করবে। এরপর JWT Filter ব্যবহার করে টোকেন যাচাই করতে হবে এবং Security Configuration এর মাধ্যমে সিকিউরিটি সেটআপ করতে হবে। এই প্রক্রিয়ার মাধ্যমে, আমরা একটি নিরাপদ এবং স্কেলেবল JWT Authentication সিস্টেম তৈরি করতে পারি যা স্প্রিং বুট REST API এর সাথে ইন্টিগ্রেট করা যাবে।
Read more